#Modulos que necesitamos importar
import os           #Para ejecutar el generador de numeros aleatorios programado en c++ a partir de SimLib
import fileinput    #Para importar los numeros a partir del txt con un simple for

#Ejecutar el codigo en C para generar los numeros aleatorios
os.system('generar_numero.exe')

# #################################################################################
#Definimos el conjunto de variables que vamos a utilizar
cant= 1000.0
#Elementos para Chi-Cuadrado
chi = []
for x in range(10): chi.append(0)
#Elementos para Corridas
corridaS= []
for x in range(7): corridaS.append(0)
corridaB= []
for x in range(7): corridaB.append(0)
anterior= 0
subida= True
cantS=0
cantB=0
rsubida=0
rbajada=0
tablaA=[[4529.4, 9044.9, 13568, 18091, 22615, 27892],
        [9044.9, 18097, 27139, 36187, 45234 , 55789],
        [13568, 27139, 40721, 54281, 67852, 83685],
        [18091, 36187, 54281, 72414, 90470, 111580],
        [22615, 45234, 67852, 90470, 113262, 139476],
        [27892, 55789, 83685, 111580, 139476, 172860],]
tablaB= [0.17, 0.208333333, 0.091666667, 0.026388889, 0.005753968, 0.001190476]
#Elementos para Test-Serial (vamos a tomar 5 divisiones [0;0.2;0.4;0.6;0.8;1])
divs= 5 #Definir aqui el numero que quieran
grox = 1.0/divs
matriz= []
for x in range(divs): matriz.append(0)
for x in range(divs):
    cols = []
    for y in range(divs): cols.append(0)
    matriz[x]= cols

# #################################################################################
#Procesamiento de listado de numeros
for numero in fileinput.input("numeros.txt"):
    numero = float(numero)
    #Test-Chi-Cuadrado:
    chi[int(numero*10)]+=1
    
    #Test Corridas:
    if (anterior < numero) and subida:#Corrida hacia arriba
        cantS+=1
    elif (anterior < numero) and not(subida):#Corta bajada (Aparece uno mayor)
        corridaB[cantB]+=1
        cantB=0
        cantS=1
        subida=True
    elif (anterior > numero) and not(subida):#Corrida hacia abajo
        cantB+=1
    elif (anterior > numero) and subida:#Corta subida (Aparece uno menor)
        corridaS[cantS]+=1
        cantS=0
        cantB=1
        subida= False

    #Test Serial (lo realizamos con duplas):
    for x in range(divs):
        if ((anterior > (grox * x)) and (anterior < (grox * x) + grox)):
            for y in range(divs):
                if ((numero > (grox * y)) and (numero < ((grox * y) + grox))): matriz[x][y]+=1

    #Llevamos el anterior siempre para Corridas y Test Serial.
    anterior= numero    
    
# #################################################################################
#Analisis de datos procesados
#Chi Cuadrado:
for x in chi: chi[chi.index(x)]= ((x-100)**2.0)/100.0

#Corridas:
for i in range(6):
    for j in range(6):
        rsubida+=tablaA[i][j] * (corridaS[i+1] - (cant*tablaB[i])) * (corridaS[j+1] - (cant*tablaB[j]))
        rbajada+=tablaA[i][j] * (corridaB[i+1] - (cant*tablaB[i])) * (corridaB[j+1] - (cant*tablaB[j]))
rsubida= rsubida / cant
rbajada= rbajada / cant

#Test Serial:
serial = 0 #Primero hacemos la sumatoria de elementos y al final lo multiplicamos
for x in range(divs):
    for y in range(divs):
        serial+= (matriz[x][y] - ((cant/2)/(divs**2)))**2
serial*= ((divs**2)/(cant/2))

# #################################################################################
#Muestra de datos:
print "Resultado de chi cuadrado:\n Valor absoluto: "+ str(sum(chi)) +" comparado con 16,92.\n"
print "Resultado de corridas:\n Corridas ascendentes:"+str(corridaS[1:])+" con R: " +str(rsubida)+ "\n Corridas descendentes:"+str(corridaB[1:])+" Resultado: " +str(rsubida) + "\n"
print "Resultados de Test Serial: " + str(serial)




